'use strict';

const Service = require('egg').Service;

class SysRoleService extends Service {
  /**
   * 分页查询
   * @param {SysRoleDto.pageDto} params 
   * @returns 
   */
  async page(params) {
    try {
      const { Op } = this.app.Sequelize;
      //得到偏移量
      const offset = (Number(params.pi || 1) - 1) * Number(params.ps || 100);
      
      //以下为拼接查询条件
      let queryCriteria = {
        delFlag: false,
      };
      if (this.ctx.helper.isDef(params.status)) {
        queryCriteria = {
          ...queryCriteria,
          status: params.status,
        };
      }
      if (this.ctx.helper.isDef(params.keyword)) {
        queryCriteria = {
          ...queryCriteria,
          [Op.or]: [
            { roleName: { [Op.like]: `%${params.keyword}%` } },
            { roleKey: { [Op.like]: `%${params.keyword}%` } },
          ],
        };
      }
      const query = {
        limit: Number(params.ps || 100),
        offset,
        distinct: true, //这一句可以去重，它返回的 count 不会把你的 include 的数量算进去
        where: queryCriteria,
        attributes: { exclude: ["delFlag"] },  //返回的不包括delFlag字段
      };

      //使用model封装好的方法进行查找所有符合条件的数据
      const res = await this.ctx.model.SysRole.findAndCountAll(query);


      return this.ctx.helper.ormSuccess(res);
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }


  /**
   * @description 创建角色
   * @param {SysRoleDto.createDto} 参数
   */
  async create(params) {
    try {
      const { Op } = this.app.Sequelize;
      // 查询权限是否存在
      const existDate = await this.ctx.model.SysRole.findOne({
        where: {
          [Op.or]: [
            {
              roleName: params.roleName
            },
            {
              roleKey: params.roleKey
            }
          ]
        }
      })
      if (existDate) {
        if (existDate.roleName === params.roleName) throw '角色名称已被使用';
        if (existDate.roleKey === params.roleKey) throw '角色标识已被使用';
      };

      //创建新角色
      await this.ctx.model.SysRole.create(params);
      return this.ctx.helper.ormSuccess();
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }

  /**
 * @description 编辑
 * @param {*} id id
 * @param {SysRoleDto.editDto} 参数
 * @returns 
 */
  async edit(id, params) {
    try {
      const editEntity = await this.ctx.model.SysRole.findByPk(id);
      if (!editEntity) throw '角色不存在';
      console.log(params, editEntity)
      if (this.ctx.helper.isDef(params.isDefault) && params.isDefault) {
        // 如果设置为默认菜单,更将原有默认角色改为非默认
        const defaultRes = await this.ctx.model.SysRole.findOne({
          where: {
            delFlag: false,
            isDefault: true
          }
        })
        if (defaultRes && defaultRes.id !== id) {
          await defaultRes.update({
            isDefault: false
          })
        }
      }
      await editEntity.update(params);
      return this.ctx.helper.ormSuccess();
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }


  /**
   * @description 删除（物理删除）
   * @param {*} id 
   * @returns 
   */
  async del(id) {
    try {
      const entity = await this.ctx.model.SysRole.findByPk(id);
      if (!entity) throw '角色不存在';
      // 查询是否存在子菜单
      const res = await this.ctx.model.SysUserRole.count({
        where: {
          roleId: id
        }
      })
      if (res > 0) throw '该角色已分配菜单，请先删除菜单';
      await this.ctx.model.SysRole.destroy({
        where: {
          id
        }
      })
      await this.ctx.model.SysRoleMenu.destroy({
        where: {
          roleId:id
        }
      })
      return this.ctx.helper.ormSuccess();
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }

  // 更新角色菜单
  async updatePerm(roleId, params) {
    const transaction = await this.ctx.model.transaction();
    try {
      console.log('更新菜单', roleId, params)
      // 先删除关联表中的数据
      await this.ctx.model.SysRoleMenu.destroy({
        where: {
          roleId
        }
      })
      // 批量插入新的关联关系
      if (Array.isArray(params) && params.length > 0) {
        await this.ctx.model.SysRoleMenu.bulkCreate(params, { updateOnDuplicate: ["roleId", "menuId"] })
      }
      await transaction.commit();
      return this.ctx.helper.ormSuccess();
    } catch (err) {
      await transaction.rollback();
      return this.ctx.helper.ormError(err);
    }
  }

  // 获取所有未删除角色
  async select(){
    try {
      const res = await this.ctx.model.SysRole.findAll({
        where: {
          delFlag: false  //虽然说数据库中是0
        },
        attributes: ["id", "roleName", "roleKey", "status"],
      })
      return this.ctx.helper.ormSuccess(res);
    } catch(err) {
      return this.ctx.helper.ormError(err);
    }
  }
}

module.exports = SysRoleService;
